package com.sc.controller;

import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.util.StrUtil;
import com.mybatisflex.core.paginate.Page;
import com.mybatisflex.core.query.QueryWrapper;
import com.sc.dto.ClazzInsertDTO;
import com.sc.dto.ClazzPageDTO;
import com.sc.dto.ClazzUpdateDTO;
import com.sc.service.TrainingDirectionsService;
import org.springframework.web.bind.annotation.*;
import org.springframework.beans.factory.annotation.Autowired;
import com.sc.entity.Clazz;
import com.sc.service.ClazzService;

import java.io.Serializable;
import java.util.*;

/**
 * 班级表 控制层。
 *
 * @author JoeZhou
 * @since 2024-09-14
 */
@RestController
@RequestMapping("/api/v1/clazz")
public class ClazzController {

    @Autowired
    private ClazzService clazzService;
    @Autowired
    private TrainingDirectionsService directionsService;

    @GetMapping("living")
    public Object livingClazz() {
        return clazzService.livingClazz();
    }
    /**
     * 添加班级表。
     *
     * @param dto 班级表
     * @return {@code true} 添加成功，{@code false} 添加失败
     */
    @PostMapping("save")
    public boolean save(@RequestBody ClazzInsertDTO dto) {
        Clazz clazz = BeanUtil.copyProperties(dto, Clazz.class);
        QueryWrapper queryWrapper = QueryWrapper.create().select("name").eq("id", dto.getDirectionId());
        clazz.setDirectionName(directionsService.getOneAs(queryWrapper, String.class));
        return clazzService.save(clazz);
    }

    /**
     * 根据主键删除班级表。
     *
     * @param id 主键
     * @return {@code true} 删除成功，{@code false} 删除失败
     */
    @DeleteMapping("remove/{id}")
    public boolean remove(@PathVariable Serializable id) {
        return clazzService.removeById(id);
    }

    /**
     * 根据主键批量删除班级表。
     *
     * @param ids 多个主键
     * @return {@code true} 删除成功，{@code false} 删除失败
     */
    @DeleteMapping("batchRemove")
    public boolean batchRemove(@RequestParam String ids) {
        return clazzService.removeByIds(Arrays.asList(ids.split(",")));
    }

    /**
     * 根据主键更新班级表。
     *
     * @param dto 班级表
     * @return {@code true} 更新成功，{@code false} 更新失败
     */
    @PutMapping("update")
    public boolean update(@RequestBody ClazzUpdateDTO dto) {
        Clazz clazz = BeanUtil.copyProperties(dto, Clazz.class);
        QueryWrapper queryWrapper = QueryWrapper.create().select("name").eq("id", dto.getDirectionId());
        clazz.setDirectionName(directionsService.getOneAs(queryWrapper, String.class));
        return clazzService.updateById(clazz, true);
    }

    /**
     * 查询所有班级表。
     *
     * @return 所有数据
     */
    @GetMapping("list")
    public List<Clazz> list() {
        return clazzService.list();
    }

    /**
     * 查询符合状态的班级表。
     * @param statuses 多个状态用,分割，如：1,2
     * @return 所有数据
     */
    @GetMapping("listByStatus")
    public List<HashMap> listByStatus(String statuses) {
        QueryWrapper queryWrapper = QueryWrapper.create().select("id", "name");
        if (StrUtil.isNotBlank(statuses)) {
            queryWrapper.in("status", statuses.split(","));
        }
        return clazzService.listAs(queryWrapper, HashMap.class);
    }

    /**
     * 根据班级表主键获取详细信息。
     *
     * @param id 班级表主键
     * @return 班级表详情
     */
    @GetMapping("getInfo/{id}")
    public Clazz getInfo(@PathVariable Serializable id) {
        return clazzService.getById(id);
    }

    /**
     * 分页查询班级表。
     *
     * @param dto 分页对象
     * @return 分页对象
     */
    @PostMapping("page")
    public Page<Clazz> page(@RequestBody ClazzPageDTO dto) {
        Page<Clazz> page = Page.of(dto.getPageNum(), dto.getPageSize());
        QueryWrapper queryWrapper = new QueryWrapper();
        if (dto.getName() != null) {
            queryWrapper.like("name", dto.getName());
        }
        if (dto.getDirectionId() != null) {
            queryWrapper.eq("direction_id", dto.getDirectionId());
        }
        if (dto.getManager() != null && !"".equals(dto.getManager())) {
            queryWrapper.eq("manager", dto.getManager());
        }

        return clazzService.pageAs(page, queryWrapper, Clazz.class);
    }

    /**
     * 根据id批量查询班级名称
     * @param ids 班级ID列表，如：1,2,3
     * @return 返回id对应的班级名称列表
     */
    @GetMapping("listClazzName")
    public List<String> listClazzName(@RequestParam String ids) {
        QueryWrapper queryWrapper = QueryWrapper
                .create()
                .select("name").in("id", ids.split(","));
        return clazzService.listAs(queryWrapper, String.class);
    }

}
